package stats;

import gtrnadb.GeneStructure;

import java.util.ArrayList;


public class Stats {
	ArrayList<int[]> nbGeneEnFonctionDeLongueur; // tab de 2: nombre en fonction de longueur
	ArrayList<GeneStructure> listGeneStructure;
	GeneStructure plusLongMot;
	int[] proportionACGT; //0->A, 1->C, 2->G, 3->T
	
	
	public Stats(ArrayList<GeneStructure> listGeneStructure) {
		this.listGeneStructure = listGeneStructure;
		this.nbGeneEnFonctionDeLongueur = new ArrayList<int[]>();
		this.proportionACGT = new int[4];
	}

	public void proportionACGT() {
		for (int i=0; i<proportionACGT.length; i++) {
			proportionACGT[i]=0;
		}
		for (GeneStructure geneStructure : listGeneStructure) {
			String seq = geneStructure.getSeq();
			for (int i=0; i<seq.length(); i++) {
				String caractere = Character.toString(seq.charAt(i));
				if (caractere.equalsIgnoreCase("A")) {
					proportionACGT[0]++;
				}
				else if (caractere.equalsIgnoreCase("C")) {
					proportionACGT[1]++;
				}
				else if (caractere.equalsIgnoreCase("G")) {
					proportionACGT[2]++;
				}
				else if (caractere.equalsIgnoreCase("T")) {
					proportionACGT[3]++;
				}
			}
		}
	}
	
	public void plusLongMot(){
		plusLongMot = listGeneStructure.get(0);
		for (GeneStructure geneStructure : listGeneStructure) {
			if (Integer.parseInt(plusLongMot.getLength())<Integer.parseInt(geneStructure.getLength())) {
				plusLongMot=geneStructure;
			}
		}
		System.out.println("Plus long mot : "+plusLongMot.getSeq());
		System.out.println("Longueur : "+plusLongMot.getLength());

	}
	
	public void nbGeneEnFonctionDeLongueur(){
		for (GeneStructure geneStructure : listGeneStructure) {
			int longueur = Integer.valueOf(geneStructure.getLength());
			boolean exist=false;
			for(int i=0; i<nbGeneEnFonctionDeLongueur.size(); i++){
				if (longueur==nbGeneEnFonctionDeLongueur.get(i)[0]) {
					nbGeneEnFonctionDeLongueur.get(i)[1]++;
					exist=true;
					break;
				}
			}
			if (!exist) {
				int[] newGene=new int[2];
				newGene[0]=longueur;
				newGene[1]=1;
				nbGeneEnFonctionDeLongueur.add(newGene);
			}
		}
		triNbGeneEnFonctionDeLongueur(0);
		afficheNbGeneEnFonctionDeLongueur();
	}
	
	public void triNbGeneEnFonctionDeLongueur(int k) { // tri soit sur la longueur, soit sur le nombre de gene 0 ou 1
		int longueur = nbGeneEnFonctionDeLongueur.size();
		int[] tmpGene;
		boolean permut;
 
		do {
			// hypothèse : le tableau est trié
			permut = false;
			for (int i = 0; i < longueur - 1; i++) {
				// Teste si 2 éléments successifs sont dans le bon ordre ou non
				if (nbGeneEnFonctionDeLongueur.get(i)[k] > nbGeneEnFonctionDeLongueur.get(i+1)[k]) {
					// s'ils ne le sont pas, on échange leurs positions
					tmpGene = nbGeneEnFonctionDeLongueur.get(i);
					nbGeneEnFonctionDeLongueur.set(i, nbGeneEnFonctionDeLongueur.get(i+1));
					nbGeneEnFonctionDeLongueur.set(i+1, tmpGene);
					permut = true;
				}
			}
		} while (permut);
	}
	
	public void afficheNbGeneEnFonctionDeLongueur() {
		for (int[] gene : nbGeneEnFonctionDeLongueur){
			System.out.println("Longueur gene: "+gene[0]+" nombre de genes:"+gene[1]);
		}
	}
	
	public ArrayList<int[]> getNbGeneEnFonctionDeLongueur() {
		return nbGeneEnFonctionDeLongueur;
	}
	
	public GeneStructure getPlusLongMot() {
		return plusLongMot;
	}
	
	public int[] getProportionACGT(){
		return proportionACGT;
	}
	
	public int getTotalACGT() {
		int res=0;
		for (int i=0; i<proportionACGT.length; i++){
			res+=proportionACGT[i];
		}
		return res;
	}
	
}